home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
tools
/
sharp
/
sxwork3.lzh
/
サンプル実用編
/
目覚まし時計
/
ALARM.C
next >
Wrap
Text File
|
1994-03-10
|
14KB
|
449 lines
/******************************************************************************
* alarm.c: 目覚まし時計の処理関数
******************************************************************************
* Workroom SX-68K Sample Program Copyright 1994 SHARP
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iocslib.h>
#include <music3.h> /* OPMDRV3.X を使用する時に必要 */
#include <sxmemory.h> /* メモリマンを利用するときに必要 */
#include <event.h> /* イベントマンを利用するときに必要 */
#include <sxgraph.h> /* グラフ系マネージャを利用するときに必要 */
#include <window.h> /* ウィンドウマンを利用するときに必要 */
#include <control.h> /* コントロールマンを利用するときに必要 */
#include <dialog.h> /* ダイアログマンを利用するときに必要 */
#include <text.h> /* テキストマンを利用するときに必要 */
#include <task.h> /* タスクマンを利用するときに必要 */
#include "alarm.h" /* このプログラム固有のヘッダファイル */
#include "alchart.h"
/******************************************************************************
* dragIcon(): アイコン表示の時のドラッグ処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* BOOLEAN dClickFlag ダブルクリックフラグ
* = TRUE: ダブルクリック
* = FALSE: シングルクリック
* 戻り値: BOOLEAN = TRUE: 処理完了
* = FALSE: 作成失敗(終了)
*/
BOOLEAN dragIcon(ComVal *pcv, BOOLEAN dClickFlag)
{
Point rpt, ipt;
Rect rc;
Region **rgnHdl;
Graph gr;
GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
/* Windowのrectをグローバル座標系に変換する */
rc = pcv->windowPtr->graph.rect;
GMSlideRect(&rc, GMLocalToGlobal(0));
rgnHdl = GMNewRgn();
if (rgnHdl == NULL) {
pcv->errorCode = 8; /* 確保できなかった */
return FALSE; /* 失敗したのでFALSEを返す */
}
GMRectRgn(rgnHdl, &rc);
/* 表示画面全体を示すGraphを作成 */
GMOpenGraph(G_TXT, &gr);
GMSetGraph(&gr);
rpt.x_y = WMDragRgn(rgnHdl, pcv->event.ev.where.x_y, &gr.rect, &gr.rect, 3, NULL);
GMDisposeRgn(rgnHdl); /* リージョンハンドルを解放する */
GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
/* 移動量有る場合は、ウィンドウの移動処理 */
if (rpt.x_y != 0) {
ipt.x_y = GMLocalToGlobal(0);
ipt.p.x += rpt.p.x;
ipt.p.y += rpt.p.y;
WMMove(pcv->windowPtr, ipt.x_y, 0);
/* 移動量0で、ダブルクリックの場合は、ウィンドウ化 */
} else if (dClickFlag)
if (!gotoWindow(pcv))
return FALSE; /* 失敗したのでFALSEを返す */
GMCloseGraph(&gr);
return TRUE; /* 処理が完了したのでTRUEを返す */
}
/******************************************************************************
* gotoWindow(): アイコン表示からウィンドウに戻す
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 処理完了
* = FALSE: 作成失敗(終了)
*/
BOOLEAN gotoWindow(ComVal *pcv)
{
Point pt;
Rect rc;
static Rect winSize = { 0, 0, WIN_H, WIN_V }; /* ウィンドウサイズ */
GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
/* アイコンの左上座標を待避 */
pt.x_y = GMLocalToGlobal(0);
rc = winSize;
/* ウィンドウ位置を変更 */
GMSlideRect(&rc, LONGWORD(pt.p.x - rc.d.left, pt.p.y - rc.d.top));
WMDispose(pcv->windowPtr);
pcv->windowPtr = WMOpen(NULL, &rc, WINTITLE,
FALSE, WI_STD2 << 4, W_FRONT, TRUE, TSGetID());
if (pcv->windowPtr == NULL) {
pcv->errorCode = 2; /* 作成できなかった */
return FALSE; /* 失敗したのでFALSEを返す */
}
GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
GMAPage(G_PAGE0 | G_PAGE1); /* アクセスページを0と1ページにする */
GMForeColor(G_BLACK);
GMBackColor(G_LGRAY);
pcv->setBtnHdl = CMOpen(pcv->windowPtr, &rcSetBtn,
(_LASCII)"\x04設定", TRUE, 0, 0, 1, CI_CHRBTN << 4, 0);
if (pcv->setBtnHdl == NULL) {
pcv->errorCode = 3; /* 作成できなかった */
return FALSE; /* 失敗したのでFALSEを返す */
}
(*pcv->setBtnHdl)->hilite = 0; /* [設定]ボタンを使用可能に */
CMDraw(pcv->windowPtr);
if (!createText(pcv)) { /* テキストエディットを作成する */
pcv->errorCode = 4; /* 作成できなかった */
return FALSE; /* 失敗したのでFALSEを返す */
}
WMShow(pcv->windowPtr); /* ウィンドウを表示する */
/* テキストエディットの表示モードをオンにする */
TMShow(pcv->tEditHdl);
pcv->iconFlag = FALSE;
return TRUE; /* 処理が完了したのでTRUEを返す */
}
/******************************************************************************
* gotoIcon(): ウィンドウをアイコン表示に変更
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 処理完了
* = FALSE: 作成失敗(終了)
*/
BOOLEAN gotoIcon(ComVal *pcv)
{
LPoint lpt;
Rect rc;
/* アイコンサイズ */
static Rect icnsize = { 0, 0, ICNSIZE_H, ICNSIZE_V };
CMKill(pcv->windowPtr);
if (pcv->tEditHdl != NULL) {
TMCaret(pcv->tEditHdl, 0); /* カーソルを消去する */
/* テキストエディットハンドルを廃棄する */
TMDispose(pcv->tEditHdl);
pcv->tEditHdl = NULL;
}
GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
/* アイコンの左上座標を待避 */
lpt = GMLocalToGlobal(0);
rc = icnsize;
GMSlideRect(&rc, lpt);
WMDispose(pcv->windowPtr);
pcv->windowPtr = WMOpen(NULL, &rc, WINTITLE,
TRUE, WI_PLN << 4, W_FRONT, TRUE, TSGetID());
if (pcv->windowPtr == NULL) {
pcv->errorCode = 2; /* 作成できなかった */
return FALSE; /* 失敗したのでFALSEを返す */
}
pcv->iconFlag = TRUE;
return TRUE; /* 処理が完了したのでTRUEを返す */
}
/******************************************************************************
* turnClock(): 指定時刻になった時のアニメーション処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void turnClock(ComVal *pcv)
{
char str[16];
if (pcv->animaMode < CHART_ENT) { /* コマ毎のループ */
GMForeColor(G_LGRAY);
GMFillRect(&rcErace);
putUdPat3(pcv, pcv->iconImg[animaChart[pcv->animaMode].patID], animaChart[pcv->animaMode].pos.x_y);
GMForeColor(G_BLACK);
if (animaChart[pcv->animaMode].flag == 1) /* 効果音付きのコマの場合 */
m_mplay(-1);
if (animaChart[pcv->animaMode].flag == 2) { /* 効果音を止めるコマの場合 */
m_mstop(-1);
m_enable(0);
}
pcv->animaWait = animaChart[pcv->animaMode].offTime + EMSysTime();
pcv->animaMode++;
} else {
/* アニメーションの終了 */
MMHdlUnlock(pcv->pcmDataHdl);
restorePcm(pcv);
GMFontSize(LONGWORD(10, 10)); /* 現在時刻の表示 */
GMForeColor(G_LGRAY);
GMFillRect(&rcErace);
putUdPat3(pcv, pcv->iconImg[0], LONGWORD(0, 8));
GMForeColor(G_BLACK);
GMMove(LONGWORD(20, 24));
sprintf(str, "%02d:%02d\0", LOWBYTE(HIWORD(pcv->nowTime)), HIBYTE(pcv->nowTime));
GMDrawStrZ(str);
pcv->animaMode = -1;
}
}
/******************************************************************************
* checkAlarmTime(): 入力された時刻をチェック
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 正常
* = FALSE: 入力された時刻が異常
*/
BOOLEAN checkAlarmTime(ComVal *pcv)
{
int len, i;
char str[16];
len = TMGetText(pcv->tEditHdl, str, TEXT_LEN);
if (len == TEXT_LEN) {
for (i = 0; i < TEXT_LEN; i++)
if (i == 2) {
if (str[i] != ':')
break;
} else if (str[i] < '0' || str[i] > '9')
break;
if (i >= TEXT_LEN) {
i = atoi(str);
if (i >= 0 && i <= 23) {
i = atoi(&str[3]);
if (i >= 0 && i <= 59) {
pcv->alarmTime = (A2BYTE(str[0], str[1]) << 16) | (A2BYTE(str[3], str[4]) << 8);
return TRUE;
}
}
}
}
DMError(D_CONFIRM, "入力された時間は、正しくありません。");
return FALSE;
}
/******************************************************************************
* putUdPat3(): レクタングルイメージのデータを下ぞろえで表示する
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* RectImg **rImgHdl レクタングルイメージハンドル
* LPoint lpt 表示座標
*/
void putUdPat3(ComVal *pcv, RectImg **rImgHdl, LPoint lpt)
{
Rect rc;
RectImg *iptr;
MMHdlLock(rImgHdl);
iptr = *rImgHdl;
rc = iptr->bounds;
GMSlideRect(&rc, lpt);
GMPlotImg(iptr->data, &rc, 0);
MMHdlUnlock(rImgHdl);
}
/******************************************************************************
* getPcmChannel(): OPMDRV3のPCMのチャンネル番号を求める
******************************************************************************
* 戻り値: char num チャンネル番号(1~25)
*/
char getPcmChannel(void)
{
int mode;
char num;
mode = m_sysch((char *) -1);
switch(mode) {
case 0:
num = 9;
break;
case 1:
num = 25;
break;
case 2:
num = 25;
break;
case 3:
num = 17;
break;
case 4:
num = 1;
break;
case 5:
num = 1;
break;
default:
num = -1;
break;
}
return num;
}
/******************************************************************************
* backupPcm(): OPMDRV3.Xに登録されているPCMデータを退避する
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 退避成功
* = FALSE: 退避失敗
*/
BOOLEAN backupPcm(ComVal *pcv)
{
int len, slen = 0;
int errCode, i;
char dmypcm[10];
len = m_pcmlen(PCMNOTENO);
if (len != 0) {
pcv->pcmBufHdl[PCMNOTENO] = MMChHdlNew(len + 4);
if (pcv->pcmBufHdl[PCMNOTENO] == NULL)
/* メモリが不足している */
return FALSE;
/* 登録したいノート番号のPCMデータを保存 */
*(long *) *pcv->pcmBufHdl[PCMNOTENO] = len;
m_pcmget(PCMNOTENO, *pcv->pcmBufHdl[PCMNOTENO] + 4, len);
/* PCMデータをクリア */
m_pcmset(PCMNOTENO, 4, 0, dmypcm);
} else
pcv->pcmBufHdl[PCMNOTENO] = NULL;
/* ベルのPCMデータを登録 */
m_pcmset(PCMNOTENO, 4, PCMLENGTH, *pcv->pcmDataHdl);
errCode = m_errget();
if (errCode == 0)
/* 正常終了 */
return TRUE;
/* 登録できなければすでに登録済みのデータを一時的に退避して登録 */
for (i = 0 ; i < 128 ; i++) {
if (i != PCMNOTENO) {
len = m_pcmlen(i);
if (len) {
pcv->pcmBufHdl[i] = MMChHdlNew(len + 4);
if (pcv->pcmBufHdl[i] == NULL)
/* メモリが不足している */
return FALSE;
*(long *) *pcv->pcmBufHdl[i] = len;
m_pcmget((char) i, *pcv->pcmBufHdl[i] + 4, len);
/* PCMデータをクリア */
m_pcmset((char) i, 4, 0, dmypcm);
slen += len;
if (slen > PCMLENGTH)
/* 必要な容量だけ退避が済んだので終了 */
break;
} else
/* 未登録のノート番号の場合 */
pcv->pcmBufHdl[i] = NULL;
}
}
/* ベルのPCMデータを登録 */
m_pcmset(PCMNOTENO, 4, PCMLENGTH, *pcv->pcmDataHdl);
errCode = m_errget();
if (i >= 128 || errCode < 0)
/* 最後まで容量が確保できない */
return FALSE;
return TRUE;
}
/******************************************************************************
* restorePcm(): 退避されているバックアップデータを元に戻す
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void restorePcm(ComVal *pcv)
{
int i, flag = FALSE;
char dmypcm[10];
for (i = 0 ; i < 128 ; i++) {
if (pcv->pcmBufHdl[i] != NULL) {
if (!flag) {
/* ベルのPCMデータをクリア */
m_pcmset(PCMNOTENO, 4, 0, dmypcm);
flag = TRUE;
}
/* 退避されたPCMデータを再設定 */
m_pcmset((char) i, 4, *(long *) *pcv->pcmBufHdl[i], *pcv->pcmBufHdl[i] + 4);
MMHdlDispose(pcv->pcmBufHdl[i]); /* ハンドルを解放する */
pcv->pcmBufHdl[i] = NULL;
}
}
}
/******************************************************************************
* loadPcm(): PCMファイルの読み込み
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 読み込み成功
* = FALSE: 読み込み失敗
*/
BOOLEAN loadPcm(ComVal *pcv)
{
int errCode, len;
int fSize; /* PCMファイルの大きさ */
FILE *fp;
Task task; /* タスク管理レコード */
char drv[2], path[65], node[19], ext[5], nWork[23];
char szFile[TS_NAMEMAX]; /* フルパスでファイル名が戻るバッファ */
TSGetTdb(&task, TS_OWN); /* タスク管理レコードを取得する */
strsfn(task.name, drv, path, node, ext); /* タスク名を分解する */
strcpy(nWork, node); /* タスク名よりファイル名を作成する */
strcat(nWork, ".PCM");
strmfn(szFile, drv, path, "", ""); /* 検索パスを作成する */
/* ファイルを検索する */
errCode = TSSearchFile(nWork, szFile, szFile);
if (errCode < 0) { /* ファイルが見付からない */
sprintf(szFile, "ファイル「%s」が\r見付かりません。\x00", nWork);
DMError(D_CONFIRM, szFile);
return FALSE;
}
fp = fopen(szFile, "rb"); /* PCMファイルをオープン */
if (!fp) { /* オープンに失敗 */
DMError(D_CONFIRM, "PCMファイルの読み込みに\r"
"失敗しました。");
return FALSE;
}
fseek(fp, 0, SEEK_END);
fSize = ftell(fp);
fseek(fp, 0, SEEK_SET);
pcv->pcmDataHdl = MMChHdlNew(fSize);
if (pcv->pcmDataHdl == NULL) {
DMError(D_CONFIRM, "メモリが確保できません。");
return FALSE;
}
MMHdlLock(pcv->pcmDataHdl);
len = fread(*pcv->pcmDataHdl, sizeof(char), (size_t) fSize, fp);
MMHdlUnlock(pcv->pcmDataHdl);
if (len != fSize) {
DMError(D_CONFIRM, "PCMファイルの読み込みに\r"
"失敗しました。");
return FALSE;
}
fclose(fp);
return TRUE;
}